﻿using System;
using System.Drawing;
using System.Numerics;

namespace TTRom
{

    /// <summary>
    /// 由Runtime实现的接口
    /// </summary>
    public interface ITTRuntime
    {
        void LoadFromFolder(string path);

        void LoadFromZip(string zipfile);

        void Update();

    }

    public struct TouchState
    {
        int id;
        int x;
        int y;
        bool press;
    }
    public struct StickState
    {
        int x; //摇杆x轴
        int y; //摇杆y轴
        bool A;
        bool B;
        bool LT;
        bool RT;
        bool Select;
        bool Start;
    }
    public enum LayerType
    {
        Tiled_Layer,
        Sprite_Layer,
    }
    public class TileMapInfo
    {
        public int texid;
        public int GridSizeX;
        public int GridSizeY;
        public int TileSize;
        public Vector2[] Data;
        public object[] CustomData;
        public float ScrollSpeed;
    }
    public class SoundInfo
    {
    }
    public class TextureInfo
    {
        public int texid;
        public string name;
        public int sizeX;
        public int sizeY;
    }
    public class SpriteInfo
    {

    }
    public class SysInfo
    {
        public TextureInfo[] alltex;
        public SpriteInfo[] allSprite;
        public SoundInfo[] allsounds;
        public SoundInfo[] allBGM;
    }
    public class UpdateInfo
    {
        public float delta;
        public Vector2 CameraPos;
        public Vector2 CameraScale;
        public TouchState[] touchState;
    }

    //CommandBuffer 在JS中实现，这里的定义只是说明他包含的功能，高频接口全都放进commandbuffer
    //尽量减少js和host 沟通次数
    public interface ICommandBuffer
    {
        void SetBackgroundColor(byte r, byte g, byte b);
        void SetCamera(int x, int y, int scaleX, int scaleY);

        void Graphics_DrawSprite(int spriteid, int x, int y, float scaleX = 1, float scaleY = 1, float roate = 0);

        void Graphics_DrawTileMap(int mapid, int x, int y);
    }


    /// <summary>
    /// 实现给rom调用的接口
    /// </summary>
    public interface IRomRuntime
    {
        //////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 通用接口组
        /// </summary>
        /// 
        //return a Json like,还有其他的参数，将来会仔细定义
        //{ "platform":"windows,
        //  "input_touchscreen":true,
        //  "input_joystick":true
        //}

        public string GetEnvString();

        //所有不变的东西，初始化一次给他
        public void Init(Action<SysInfo> onInit, Func<UpdateInfo,/*[out]*/ ICommandBuffer> onUpdate);

        //public void RegUpdateCalback(Action<UpdateInfo> update);

        //当在onInit中做好初始化之后调用
        public void Start();
        public void Exit();//游戏退出
        public void SaveData(int slot, string data);
        public string LoadData(int slot);



        //要考虑跨语言调用的性能问题，减少调用次数第一，减少传递类型复杂度第二
        //UpdateCallback的回调可以复杂一点
        //但是的
        //////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 外部交互接口组
        /// </summary>


        //对接登录或者实名之类
        public string ReqLogin(string regstr);

        //冲值或奖励,可以用来对接激励视频 或者冲值接口
        public bool ReqResource(string reqstr);

        //留一个自定义
        public string ReqCustom(string reqstr);

        //////////////////////////////////////////////////////////////////////////////////////////////
        ///低性能待优化
        //public TextureInfo[] Graphics_ListTexture();
        //public SpriteInfo[] Graphics_ListSprite();
        //public SoundInfo[] Sound_List();

        //public SoundInfo[] Sound_ListBGM();

        //////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 图形接口组
        /// </summary>

        //创建Tiledmap
        int Graphics_CreateTileMap(TileMapInfo info);


        ////可能是个高频接口
        //public SpriteInfo Graphics_GetSprite(string id);

        ////可能是个高频接口，这个方式不行
        //public TextureInfo Graphics_GetTexutre(string id);
        //删除，用回调给
        //public Vector2 Graphics_GetCameraPos();
        //public Vector2 Graphics_GetCameraScale();

        //改为用CommandBuffer一次传递
        //高频接口
        //public void Graphics_SetBackgroundColor(byte r, byte g,byte b);
        //public void Graphics_SetCamera(int x,int y,int scaleX, int scaleY);




        ////这两个绘制函数，请在Update中调用
        //public void Graphics_DrawSprite(int spriteid, int x, int y, float scaleX = 1, float scaleY = 1, float roate = 0);

        //public void Graphics_DrawTileMap(int mapid, int x, int y);


        //////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 输入接口组
        /// </summary>

        //全取消，用回调给
        //public bool Input_CanTouch();
        //public TouchState[] Input_GetTouch();
        //public bool Input_CanStick();
        //public StickState Input_GetStickState();

        //显示一个模态对话框，输入文字
        public string Input_Prompt(string title, string deftext);

        //////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 声音接口组
        /// </summary>
        //播放一段声音，播放Once的是普通的声音，注意这不是BGM，这是短音效，返回一个id,该id可以用来终止播放
        public int Sound_PlayOnce(string sndid, float vol);
        public int Sound_StopPlay(int id, bool fadeout = false, float fadetime = 1.0f);
        //声音总音量
        public bool Sound_SetVol(float v);


        public string Sound_GetPlayedBGM();
        public bool Sound_PlayBGM(string bgmid);

        //停止BGM，不可以回复，再播放只能用Play
        public void Sound_StopBGM();
        //暂停，还可以恢复。除非你又Play了另一个BGM
        public void Sound_PauseBGM();
        public void Sound_ResumeBGM();

        //BGM总音量
        public bool Sound_SetBGMVol(float v);
    }
}